import router from '@/router'
import { useLoginUserStore } from '@/stores/useLoginUserStore'
import { useAuthStore } from '@/stores/useAuthStore'
import checkAccess from './checkAccess'

router.beforeEach(async (to, from, next) => {
  const loginUserStore = useLoginUserStore()
  const authStore = useAuthStore()
  let loginUser = loginUserStore.loginUser

  // 如果跳转到登录页面，隐藏登录过期弹窗
  if (to.path === '/user/login') {
    authStore.hideLoginExpiredModal()
  }

  // 检查页面是否设置了权限要求
  const needAccess = to.meta?.access as string

  // 如果页面没有设置权限要求，直接放行（公开页面）
  if (!needAccess) {
    next()
    return
  }

  // 只有明确设置了权限要求的页面才进行登录检查
  // 如果当前没有登录用户信息或用户信息不完整，尝试从服务器获取
  if ((!loginUser || !loginUser.userRole) &&
      !to.path.includes('/user/login') &&
      !to.path.includes('/user/register')) {
    try {
      // 尝试验证当前的会话状态
      const fetchSuccess = await loginUserStore.fetchLoginUser();
      if (!fetchSuccess) {
        throw new Error('获取用户信息失败')
      }
      loginUser = loginUserStore.loginUser;
    } catch (error) {
      // 获取登录信息失败，说明用户未登录或登录已过期
      console.log('获取用户登录信息失败:', error)
      // 对于需要权限的页面，显示登录过期弹窗（弹窗中用户可选择是否登录）
      authStore.showLoginExpiredModal(to.fullPath)
      next(false) // 阻止路由跳转，保持在当前页面
      return
    }
  }

  // 如果没登录，显示登录过期弹窗
  if (!loginUser || !loginUser.userRole) {
    // 显示登录过期弹窗（只有需要权限的页面才显示，用户可在弹窗中选择登录）
    authStore.showLoginExpiredModal(to.fullPath)
    next(false) // 阻止路由跳转，保持在当前页面
    return
  }

  // 如果已经登录了，但是权限不足，那么跳转到无权限页面
  if (!checkAccess(loginUser, needAccess)) {
    next('/noAuth')
    return
  }

  next()
})
